package com.practise.demo;

import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import jakarta.websocket.server.PathParam;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

// 传递参数是，前后端参数名应该相同 如果不同 可以使用参数绑定来进行传参
@RestController
@RequestMapping("/request")
public class RequestController {
    @RequestMapping("/oneparam")
    public String f1(String keyword) {
        return "keyword = " + keyword;
    }

    @RequestMapping("/oneintegerparam")
    public String f2(Integer number) {
        return "number = " + number;
    }

    @RequestMapping("/oneintparam")
    public String f3(int number) {
        return "number = " + number;
    }

    @RequestMapping("/twoparam")
    public String f4(String str1, String str2) {
        return "str1 = "+ str1 + ", str2 = " + str2;
    }

    @RequestMapping("/paramdifferent")
    //此时，前端使用 p 给 keyword 传参
    //但是不能使用 keyword 传参，使用的话会出错
    // 如果进行设置，将 required=false 那么就不会报错了，但是值也是 null
    public String f5(@RequestParam(value = "p",required = false) String keyword){
        return "keyword = " + keyword;
    }

    @RequestMapping("/objectparam")
    // 参数为对象的时候，传参的时候依旧是使用对象的属性进行传参
    public String f6(UserInfo userInfo){
        return userInfo.toString();
    }

    @RequestMapping("/arrayparam")
    public String f7(Integer[] array){
        return Arrays.toString(array);
    }

    @RequestMapping("/listparam")
    public List f8(List<Integer> list){
        return list;
    }

    // 传递json
    @RequestMapping("/jsonparam")
    public String f9(@RequestBody UserInfo userInfo){
        return userInfo.toString();
    }

    // 从url中获取参数
    @RequestMapping("/urlparam/{id}")
    public String f10(@PathVariable Integer id){
        return "id = " + id;
    }
    @RequestMapping("/urlparam/{id}/{name}")
    // 此时不能只传一个参数
    public String f10(@PathVariable Integer id,@PathVariable String name){
        return "id = " + id + "name = " + name;
    }

    // 上传文件
    @RequestMapping("/fileparam")
    public String f11(@RequestPart MultipartFile file) throws IOException {
        file.transferTo(new File("D:/temp/"+file.getOriginalFilename()));
        System.out.println(file.getOriginalFilename() + file.getName());
        return "文件上传成功！";
    }

    // 传递Cookie方法1
    @RequestMapping("/cookie1")
    public String f12(HttpServletRequest request){
        Cookie[] cookies = request.getCookies();
        if(cookies != null){
            for(Cookie cookie : cookies){
                System.out.println(cookie.getName() + ":" + cookie.getValue());
            }
        }
        return "返回 Cookie 成功";
    }

    // 传递cookie方法2
    @RequestMapping("/cookie2")
    public String f13(@CookieValue("name") String name){
        // 这个方法每次只能传递一个cookie 没有上面的方法高效
        return "返回 Cookie " + name;
    }

    // 存储session
    @RequestMapping("/setsession")
    public String setSession(HttpServletRequest request){
        // 从 cookie 中取sessionId，根据sessionId来获取session
        // 如果没有那么就会创建一个
        // getSession(true) 如果没有session会自动创建一个 session
        // getSession(false) 如果没有session，返回null
        HttpSession session = request.getSession();
        // 默认存储在内存中
        // 所以会随着服务器的启动而消失
        session.setAttribute("name","zhangsan");
        session.setAttribute("gender",1);
        session.setAttribute("age",20);
        System.out.println(session.getAttribute("name") + " " +
                session.getAttribute("gender") + " " +
                session.getAttribute("age"));
        return "存储session成功";
    }

    // 传递session 方法1
    @RequestMapping("getsession1")
    public String getSession1(HttpServletRequest request){
        // 从cookie中获取sessionId，根据sessionId获取session对象
        // 如果没有也不创建session
        HttpSession session = request.getSession(false);
        if(session == null){
            return "用户未登录";
        }else{
            // 需要进行类型转换
            String name = (String)session.getAttribute("name");
            return "登录用户为：" + name;
        }
    }

    // 传递session 方法2
    @RequestMapping("/getsession2")
    public String getSession2(HttpSession session){
        // 需要进行类型转换
        // 不需要再判断 session == null
        // 原因是使用HttpSession 相当于是使用getSession()方法，且默认为true
        // 如果不存在就会创建一个，所以在没有session的时候，返回的是null所以不用判断
        String name = (String)session.getAttribute("name");
        return "登录用户为：" + name;
    }

    // 传递session 方法3
    @RequestMapping("/getsession3")
    public String getsession3(@SessionAttribute("name") String name){
        // 不需要再判断 session == null 理由同上
        return "登录用户为：" + name;
    }

    // 传递 Header方法1
    @RequestMapping("/getheader1")
    public String getHeader1(HttpServletRequest request){
        // 任意一个header都可以，只要getHeader()中的参数名在header中存在即可
        String host = request.getHeader("Host");
        return "获取header成功" + host;
    }

    // 传递 Header方法2
    @RequestMapping("/getheader2")
    public String getHeader2(@RequestHeader("User-Agent") String userAgent){
        return "获取header成功" + userAgent;
    }




}
